首先在 Board 元件中加入一個叉叉的按鈕:
import React from "react";
import styles from "./Board.module.scss";
const Board = props => {
  return (
    <div className={styles.board}>
      {/* 加入刪除看板按鈕 */}
      <button className={styles.closeButton}>
        x
      </button>
      <h2 className={styles.name}>
        {props.name}
      </h2>
    </div>
  );
};
並且在 Board.modules.scss 中加入樣式:
.board {
  &:hover {
    .closeButton {
      visibility: visible;
    }
  }
  .closeButton {
    position: absolute;
    top: 4px;
    right: 4px;
    visibility: hidden;
    color: white;
    &:hover {
      color: white;
    }
  }
}
接著希望在叉叉按鈕被點擊時刪除該看板,因此在 Board 元件需要從 App 元件透過 props 取得 dispatch 函式,而且呼叫 dispatch 函式會傳入一個刪除看板的 action 物件,其中會需要看板的 id,因此也需要透過 props 取得 :
App 元件
<Board
  key={id}
  name={state.boards.byId[id].name}
  dispatch={dispatch}
  id={id}
/>
Board 元件
import React from "react";
import styles from "./Board.module.scss";
const Board = props => {
  return (
    <div className={styles.board}>
      <button
        className={styles.closeButton}
        // 偵測按鈕被點擊的事件
        onClick={() => {
          props.dispatch({
            type: "REMOVE_BOARD",
            payload: {
              boardId: props.id
            }
          });
        }}
      >
        x
      </button>
      <h2 className={styles.name}>
        {props.name}
      </h2>
    </div>
  );
};
編輯看板名稱和編輯標題的實作方式差不多,各位讀者可以參考前面這一篇文章。
我們一樣要有一個 state 來控制是否進入編輯看板名稱的模式:
import React from "react";
import styles from "./Board.module.scss";
const Board = props => {
  const [isEditingName, setIsEditingName] = React.useState(false);
  return (
    <div className={styles.board}>
      <button
        className={styles.closeButton}
        onClick={() => {
          props.dispatch({
            type: "REMOVE_BOARD",
            payload: {
              boardId: props.id
            }
          });
        }}
      >
        x
      </button>
      {isEditingName ? (
        <input
          // 加上 autoFocus 屬性讓文字輸入框自動出現游標
          autoFocus
          // 從 props 取得看板名稱
          value={props.name}
          // 加上 className
          className={styles.editNameInput}
          // 偵測文字內容改變的事件
          onChange={e => {
            dispatch({
              type: "CHANGE_BOARD_NAME",
              payload: {
                boardId: props.id,
                boardName: e.target.value
              }
            });
          }}
          // 偵測按下 Enter 的事件
          onKeyPress={e => {
            if (e.key === "Enter") {
              setIsEditingName(false);
            }
          }}
        />
      ) : (
        <h2
          className={styles.name}
          // 看板名稱的文字被點擊時離開編輯模式
          onClick={() => setIsEditingName(true)}
        >
          {props.name}
        </h2>
      )}
    </div>
  );
};
在 Board.module.scss 多加上一些樣式:
.board {
  .editNameInput {
    width: 50%;
  }
}

加入新增卡片的功能。